強化學習是什麼第二章已經描述完哩,接下來這章就要介紹環境(environment)的部分。
agent的對象,環境(environment)是需要我們去制定的。現在想像你自己就是代理人(高智能Agent),正在打馬力歐的遊戲機,右上的分數越高你越開心~你對搖桿跟按鈕不斷操作,每當做了操作,螢幕便會給下一幀畫面,以及更新右上分數(沒就不變),這就是環境與你的關係。現在呢,我們要介紹現有的開源套件,OpenAI-gym,讓你有個環境好好鍛鍊算法XD 那我們就開始用程式嘗試看看~
終機端輸入pip install gym
或在jupter的單元格裡面輸入!pip install gym
安裝完後在終機端輸入python,或jupyter單元塊開始輸入指令。
import gym
env = gym.make('MountainCar-v0')
env.reset()
env.render()
一個小車就出現了XD它的畢生追求(我們設計給它的終點)就是爬到右邊的旗杆那。
gym.make()
可以呼叫建置好的環境,其他內建好的經典環境可參考這裡→ https://gym.openai.com/envs/#classic_control 也可設計自己的環境,但需要參考官網的制定好的規則實作,有些制定的資料格式跟命名需要去遵循,有機會我們再來為這個寫一篇做介紹。
env.reset()
讓環境有個新的開始,一開始初始化都會叫一次,車子到終點,回合結束後會在呼叫一次,刷新遊戲的回合。在reset的同時屏幕顯示個array,裡面包了兩個數字,這兩個是什麼東西呢?第一個是小車的位置,第二個是小車的加速度,詳情可參考→https://github.com/openai/gym/wiki/MountainCar-v0。
env.render()
視覺化呈現,它只會回應出呼叫那一刻的畫面給你,要它持續出現,需要寫個迴圈。
env.step(action)
執行動作的function,我們在這可以輸入0~2的值,數字分別代表左(0)、不動(1)、右(2)。
這邊要做個補充,在這小車的環境範例中,跟算法互動的環境訊息(state)只會有(1)位置跟(2)加速度,那render的function是做什麼呢?它僅是視覺化整個過程做參考,但不會參與訓練,不過如果是Atari或其他環境,提供的環境訊息(state)就有很多是畫面。
為什麼不直接給畫面,不是挺直覺的嗎?答案是,直覺僅是對我們人類來說,對於演算法來講,數值化的資訊會較有利訓練。如果是直接給畫面,模型還需要把對畫面做資訊萃取(理解),基於這個理解,找出規則並制定決策。就數值化資訊來講,如果能清楚哪些資訊是重要的,直接提供給算法是最理想的辦法。如果是真的要用畫面做,很多的優化方案是先做前處理,例如二值化,或對畫面裡的物件套上邊框,把一些噪聲(noisy)處理掉,效果會好很多。
接下來跑迴圈試試:
import random
import gym
env = gym.make('MountainCar-v0')
env.reset()
random_number = lambda:random.randint(0,2)
while True:
env.step(random_number())
env.render()
補充:lambda叫匿名函數,詳情可參考→https://www.w3schools.com/python/python_lambda.asp
開始跑迴圈後,會看到小車很隨意的在動了XD!耶...但屏幕回傳的東西是什麼呢?
(array([-5.49165670e-01, 1.93007017e-04]), -1.0, False, {})
這個元組(tuple)包含四種資訊,命名跟格式OpenAI定義好的,跟別的環境互動也會是這樣子~
就跟剛剛環境資訊是一樣的意思~state可能會聯想到電腦的狀態或數值化計算,叫observation會比較直覺,不過許多研究跟論文都說成state,我們就統一主流用法拉~
獎懲值(reward),在這它的reward給-1,希望小車盡快往右上爬不要拖台錢XDD。reward是可以在源碼改的,之前看過有人用以小車跟終點距離做reward,越近獎勵越大,效果更好~
這是告訴整個主程序,遊戲這回合是否已達到終點。
第四個是額外訊息的提供,就看需求要不要添加其他資訊。
測試gymunit1_test_gym.py
好哩今天分享到這邊,再幾天我們講解最基本的算法,就可以來玩實作囉XD
如果對Q-learning朋友可跳這邊-> Day_9 baselines 算法集合
補充:小車環境的資訊:https://github.com/openai/gym/wiki/MountainCar-v0